﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using Microsoft.Xna.Framework;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using GestionEco;
using Microsoft.Xna.Framework.Content;
using Microsoft.Xna.Framework.Graphics;
using System.Drawing;
using System.IO;

namespace Ecosystème
{
    public static class Traitements
    {

        public static List<EtreVivant> laListeEcosysteme;
        public static Plateau lePlateau;
        private static Random rand = new Random();
        public static int nbTours;
        public static int tourCourant;
        public static int indexDeIndividusCourant;

        public static void initialisation(ContentManager leContent)
        {
            nbTours = 100;
            tourCourant = 0;
            laListeEcosysteme = new List<EtreVivant>();
            lePlateau = new Plateau();
            int i = 0;

            //Génération des êtres vivant

            /*while (i < 10)
            {
                laListeEcosysteme.Add(new Cactus(true,5,10,1,6,10,2,2,System.Drawing.Image.FromFile(Application.StartupPath + @"\Content\EtreVivants\cactus.png")));
                i++;
            }

            i = 0;
            while (i < 10)
            {
                laListeEcosysteme.Add(new Chameau(true,100,5,8,2,6,7,200,20,200,20,6,20,5,2,System.Drawing.Image.FromFile(Application.StartupPath + @"\Content\EtreVivants\chameau.png")));
                i++;
            }*/

            i = 0;
            while (i < 10)
            {
                laListeEcosysteme.Add(new Chat(true, 100, 5, 8, 2, 6, 7, 200, 20, 200, 20, 6, 20, 5, 2, System.Drawing.Image.FromFile(Application.StartupPath + @"\Content\EtreVivants\chat.png")));
                i++;
            }

            /*i = 0;
            while (i < 10)
            {
                laListeEcosysteme.Add(new Chevre(true, 100, 5, 8, 2, 6, 7, 200, 20, 200, 20, 6, 20, 5, 2, System.Drawing.Image.FromFile(Application.StartupPath + @"\Content\EtreVivants\chevre.png")));
                i++;
            }
            i = 0;
            while (i < 10)
            {
                laListeEcosysteme.Add(new Chien(true, 100, 5, 8, 2, 6, 7, 200, 20, 200, 20, 6, 20, 5, 2, System.Drawing.Image.FromFile(Application.StartupPath + @"\Content\EtreVivants\chien.png")));
                i++;
            }

            i = 0;
            while (i < 10)
            {
                laListeEcosysteme.Add(new Loup(true, 100, 5, 8, 2, 6, 7, 200, 20, 200, 20, 6, 20, 5, 2, System.Drawing.Image.FromFile(Application.StartupPath + @"\Content\EtreVivants\loup.png")));
                i++;
            }

            i = 0;
            while (i < 10)
            {
                laListeEcosysteme.Add(new Pigeon(true, 100, 5, 8, 2, 6, 7, 200, 20, 200, 20, 6, 20, 5, 2, System.Drawing.Image.FromFile(Application.StartupPath + @"\Content\EtreVivants\pigeon.png")));
                i++;
            }

            i = 0;
            while (i < 10)
            {
                laListeEcosysteme.Add(new Requin(true, 100, 5, 8, 2, 6, 7, 200, 20, 200, 20, 6, 20, 5, 2, System.Drawing.Image.FromFile(Application.StartupPath + @"\Content\EtreVivants\requin.png")));
                i++;
            }

            i = 0;

            while (i < 10)
            {
                laListeEcosysteme.Add(new Tulipe(true, 5, 10, 1, 6, 10, 2, 2, System.Drawing.Image.FromFile(Application.StartupPath + @"\Content\EtreVivants\tulipe.png")));
                i++;
            }*/

            //Transformation des images en textures


            i = 0;

            //Génération des terrains


            for (i = 0; i < 16; i++)
            {
                lePlateau.LesCases.Add(new List<Case>());
                for (int j = 0; j < 9; j++)
                {
                    switch (rand.Next(0,5))
                    {
                        case 1:
                            lePlateau.LesCases[i].Add(new Case(leContent.Load<Texture2D>("Mer"),"Mer"));
                            break;
                        case 2:
                            lePlateau.LesCases[i].Add(new Case(leContent.Load<Texture2D>("Plaine"),"Plaine"));
                            break;
                        case 3:
                            lePlateau.LesCases[i].Add(new Case(leContent.Load<Texture2D>("Foret"),"Foret"));
                            break;
                        case 4:
                            lePlateau.LesCases[i].Add(new Case(leContent.Load<Texture2D>("Montagne"),"Montagne"));
                            break;
                        default:
                            lePlateau.LesCases[i].Add(new Case(leContent.Load<Texture2D>("Desert"),"Desert"));
                            break;
                    }
                }
            }

            //Association des etres vivants aux cases
            foreach (EtreVivant ev in laListeEcosysteme)
            {
                
         
                 lePlateau.LesCases.ElementAt(rand.Next(0,15)).ElementAt(rand.Next(0,8)).ListEVCase.Add(ev);

            }

            indexDeIndividusCourant = 0;

        }

        public static void actionEtreVivant()
        {
            EtreVivant etreVivantEnCours = laListeEcosysteme.ElementAt(indexDeIndividusCourant);

            if ((etreVivantEnCours.SoifActuelle - etreVivantEnCours.CoeffSoif) <= 0)
            {
                etreVivantEnCours.SoifActuelle = 0;
                tuerUnIndividus();
            }
            else
            {
                etreVivantEnCours.SoifActuelle -= etreVivantEnCours.CoeffSoif;
            }

            etreVivantEnCours.PointsActionActuels = 3;

            if (etreVivantEnCours.GetType().BaseType.Name.ToString().Equals("Vegetal") == false)
            {
                deplacerUnIndividus();
            }
            etreVivantEnCours.retraitPoints(1);


            if (etreVivantEnCours.PointsActionActuels > 0)
            {
                nourirUnIndividus();
                etreVivantEnCours.retraitPoints(1);
            }

            if (etreVivantEnCours.PointsActionActuels > 0)
            {
                desaltererUnIndividus();
                etreVivantEnCours.retraitPoints(1);
            }



            etreVivantEnCours.vieillir();

            if (etreVivantEnCours.VieActuelle <= 0)
            {
                tuerUnIndividus();
            }



            indexDeIndividusCourant++;
            if (indexDeIndividusCourant >= laListeEcosysteme.Count)
            {
                  indexDeIndividusCourant = 0;
            }
        }

        public static void deplacerUnIndividus()
        {
            EtreVivant etreVivantEnCours = laListeEcosysteme.ElementAt(indexDeIndividusCourant);

            Case laCaseSource = lePlateau.LesCases.ElementAt((int)(etreVivantEnCours.LesCoordDeEtreVivant.Origine.X / 50)).ElementAt((int)(laListeEcosysteme.ElementAt(indexDeIndividusCourant).LesCoordDeEtreVivant.Origine.Y / 50));

            Case laCaseCible;

            if (((int)(etreVivantEnCours.LesCoordDeEtreVivant.Origine.X / 50) + 1) >= lePlateau.LesCases.Count)
            {

                laCaseCible = lePlateau.LesCases.ElementAt(0).ElementAt((int)(etreVivantEnCours.LesCoordDeEtreVivant.Origine.Y / 50));

            }
            else
            {
                laCaseCible = lePlateau.LesCases.ElementAt((int)(etreVivantEnCours.LesCoordDeEtreVivant.Origine.X / 50) + 1).ElementAt((int)(etreVivantEnCours.LesCoordDeEtreVivant.Origine.Y / 50));
            }

            laCaseSource.ListEVCase.Remove(etreVivantEnCours);
            laCaseCible.ListEVCase.Add(etreVivantEnCours);
            Console.WriteLine(etreVivantEnCours.affichageConsole() + " : deplacement");
        }

        public static void nourirUnIndividus()
        {
            EtreVivant etreVivantEnCours = laListeEcosysteme.ElementAt(indexDeIndividusCourant);


            Console.WriteLine(etreVivantEnCours.affichageConsole() + " : nourris");
        }

        public static void desaltererUnIndividus()
        {
            EtreVivant etreVivantEnCours = laListeEcosysteme.ElementAt(indexDeIndividusCourant);
            Case laCaseSource = lePlateau.LesCases.ElementAt((int)(etreVivantEnCours.LesCoordDeEtreVivant.Origine.X / 50)).ElementAt((int)(laListeEcosysteme.ElementAt(indexDeIndividusCourant).LesCoordDeEtreVivant.Origine.Y / 50));

            if (laCaseSource.Terrain.QteEauActuelle > 0)
            {
                //int aboire = laCaseSource.Terrain.QteEauActuelle;
                int aboire = 0;
                if (laCaseSource.Terrain.QteEauActuelle <= (etreVivantEnCours.SoifMax - etreVivantEnCours.SoifActuelle))
                {
                    aboire = laCaseSource.Terrain.QteEauActuelle;
                    laCaseSource.Terrain.QteEauActuelle = 0;

                }
                else
                {
                    laCaseSource.Terrain.QteEauActuelle -= (etreVivantEnCours.SoifMax - etreVivantEnCours.SoifActuelle);
                    aboire = etreVivantEnCours.SoifMax - etreVivantEnCours.SoifActuelle;
                }

                etreVivantEnCours.boire(aboire);

                Console.WriteLine(etreVivantEnCours.affichageConsole() + " : desaltere de :" + aboire + " eau" );
            }
            else
            {
                if (etreVivantEnCours.SoifActuelle >= etreVivantEnCours.SoifMax)
                {
                    etreVivantEnCours.VieActuelle -= 15;
                }

                Console.WriteLine(etreVivantEnCours.affichageConsole() + " : plus deau sur le terrain, impossible de se desalterer");
            }


        }

        public static void tuerUnIndividus()
        {

            EtreVivant etreVivantEnCours = laListeEcosysteme.ElementAt(indexDeIndividusCourant);
            Case laCaseSource = lePlateau.LesCases.ElementAt((int)(etreVivantEnCours.LesCoordDeEtreVivant.Origine.X / 50)).ElementAt((int)(laListeEcosysteme.ElementAt(indexDeIndividusCourant).LesCoordDeEtreVivant.Origine.Y / 50));
            laCaseSource.ListEVCase.Remove(etreVivantEnCours);
            laListeEcosysteme.Remove(etreVivantEnCours);
            Console.WriteLine(etreVivantEnCours.NomEtre + " : mort");
        }


      }
    }
